package com.h2cloud.aspect.Lock;


import java.lang.annotation.*;

/**
 * 基于现有业务实现
 * 分布式锁
 *
 * 一般情况下 不需要设定以下参数
 *
 * @author xp7
 *
 */
@Documented
@Target({ ElementType.METHOD,ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Lock {

	/**
     * 缓存过期时间，单位是秒
     * 默认30秒
     */
    int expire() default 30;

    /**
     * 周期时间，单位是秒
     * 在周期时间未获取到锁将重复轮询，直到cycleTime到期或获取到为止
     * 默认不需要轮询，直接返回结果
     */
    int cycle() default 0;
    
    /**
     * 缓存key,一般情况下没必要自定义
     * 默认key为方法类路径+方法名称
     *
     * 最终存储到key+请求参数
     * @return String
     */
    String key() default "";

    /**
     * 自定义缓存参数名称
     * 默认用方法中所有参数作为缓存参数
     *
     * 举例：
     * 原来"缓存注解方法"中无意义或重复的参数过多，可以仅保留需要的参数即可 objectId/processInstanceId/EmployeeId
     * 参数名称要与方法上的参数保持一致
     *     @Lock(paramName = {"processInstanceId"})
     *     public WorkflowRecordIndex getRecordByProcessInstanceId(String processInstanceId,String a ,String b ,String c...) {
     *         ...
     *     }
     *
     * @return {@link String[]}
     */
    String[] paramName() default {};

    /**
     * 未获取到分布式锁将抛出运行期异常
     * java.lang.RuntimeException: 请勿重复操作！
     * 可自定义异常返回名称
     *
     * @return String
     *
     */
    String exceptionDesc() default "请勿重复操作！";

}
